home *** CD-ROM | disk | FTP | other *** search
/ Aminet 16 / Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso / Aminet / util / boot / StartSelect.lha / StartupSelector11 / source / StartupSelector.e
Text File  |  1996-09-27  |  11KB  |  397 lines

  1. /*     Startup  Selector     */
  2. /*   by OLIVERES Jean-Marc   */
  3. /* (c) 1996 Moonchild  Prod. */
  4. /*          24.09.96         */
  5.  
  6. OPT REG=3
  7.  
  8. MODULE 'dos/dos','dos/dostags','intuition/intuition','intuition/screens',
  9.        'gadtools','libraries/gadtools','reqtools','libraries/reqtools',
  10.        'exec/nodes','exec/lists','amigalib/lists'
  11.  
  12. ENUM ER_NONE,ER_WIN,ER_DIR,ER_NODIR,ER_SCR,ER_MOUSE,ER_EXAM,ER_REQ,ER_GAD,
  13.          ER_FILE,ER_MEM
  14. ENUM WBS=1,USER,LVID,RMB,WBSP
  15.  
  16. RAISE ER_WIN   IF OpenWindowTagList()=NIL,
  17.             ER_SCR   IF LockPubScreen()=NIL,
  18.             ER_MOUSE IF Mouse()<>1,
  19.             ER_EXAM  IF Examine()=NIL,
  20.             ER_MEM   IF New()=NIL
  21.  
  22. CONST BIGGER=-1,SMALLER=1
  23.  
  24. DEF ptrwin=NIL:PTR TO window,glist=NIL
  25. DEF scr=NIL:PTR TO screen,visual,menu
  26. DEF lv_width,lv_heigth,fic_nbr=0,fic_lng=0
  27. DEF info:fileinfoblock,dirscan,dirlock
  28. DEF ch[70]:STRING,count[3]:ARRAY
  29. DEF list=NIL:PTR TO lh,node=NIL:PTR TO ln
  30. DEF f_hdl,nodename,wbsplus,wbsp_path
  31.  
  32. PROC main() HANDLE
  33.     DEF mes=NIL:PTR TO intuimessage
  34.     DEF id,gad=NIL:PTR TO gadget,i,userdata,idcmp,item
  35.     init()
  36.     choicerep()
  37.     nodename:=readlog()
  38.     Mouse()
  39.     scr:=LockPubScreen(NIL)
  40.     visual:=GetVisualInfoA(scr,NIL)
  41.     wbsp_path:='SYS:prefs/WBStartup+Prefs'
  42.     wbsplusprefs()
  43.     scanstartupdir()
  44.     addstartgadget()
  45.     window()
  46.     createmen()
  47.     REPEAT
  48.         IF mes:=Gt_GetIMsg(ptrwin.userport)
  49.             idcmp:=mes.class
  50.             SELECT idcmp
  51.             CASE IDCMP_MENUPICK
  52.                 IF (item:=ItemAddress(menu,mes.code))<>NIL
  53.                     id:=Long(item+34)
  54.                     IF id=1 THEN req('StartupSelector\n\nVersion 1.1\n\nCopyright © 1996\n\n'+
  55.                                                      'Moonchild Prod.')
  56.                     IF id=2 THEN SystemTagList('NewCli',NIL)
  57.                     IF id=3
  58.                         IF ptrwin THEN CloseW(ptrwin)
  59.                         Gt_ReplyIMsg(mes)
  60.                         quit()
  61.                     ENDIF
  62.                 ENDIF
  63.             CASE IDCMP_GADGETUP
  64.                 gad:=mes.iaddress
  65.                 userdata:=gad.userdata
  66.                 SELECT userdata
  67.                 CASE USER
  68.                     count[]:=Not(count[])
  69.                 CASE WBS
  70.                     count[1]:=Not(count[1])
  71.                 CASE RMB
  72.                     count[2]:=Not(count[2])
  73.                 CASE WBSP
  74.                     SystemTagList(wbsp_path,NIL)
  75.                 CASE LVID
  76.                     node:=list.head
  77.                     FOR i:=1 TO mes.code DO node:=node.succ 
  78.                     Gt_ReplyIMsg(mes)
  79.                     IF count[2] THEN writelog(node.name)
  80.                     launchstart(node.name)
  81.                 ENDSELECT
  82.             ENDSELECT
  83.             Gt_ReplyIMsg(mes)
  84.         ELSE
  85.             WaitPort(ptrwin.userport)
  86.         ENDIF
  87.     UNTIL idcmp=IDCMP_CLOSEWINDOW
  88.     IF count[2] THEN writelog(nodename)
  89.     launchstart(nodename)
  90. EXCEPT
  91.     SELECT exception
  92.         CASE ER_WIN          ;    req('Unable to open window !')
  93.         CASE ER_DIR          ;    req('Can''t find your directory !')
  94.         CASE ER_NODIR      ;    req('Not a directory !')
  95.         CASE ER_SCR          ;    req('Unable to lock Workbench screen !')
  96.         CASE ER_EXAM      ;    req('Can''t access directory or file !')
  97.         CASE ER_GAD     ; req('Can''t open the Gadtools.library !')
  98.         CASE ER_MEM     ; req('Not enough memory !')
  99.         CASE ER_MOUSE
  100.             IF count[2]
  101.                 launchstart(nodename)
  102.             ELSE
  103.                 StrCopy(ch,dirscan,ALL)
  104.                 AddPart(ch,'Startup-Sequence',70)
  105.                 IF (dirlock:=Lock(ch,ACCESS_READ))=NIL
  106.                     req('No Startup-Sequence !\nPress ''OK'' to load the Workbench')
  107.                     SystemTagList({lwb},NIL)    
  108.                     quit()
  109.                 ENDIF
  110.             ENDIF
  111.             launchstart('Startup-Sequence')
  112.     ENDSELECT
  113.     quit()
  114. ENDPROC
  115.  
  116. PROC init()
  117.     VOID '$VER:Startup Selector 1.1 (24.09.96) Moonchild Prod.'
  118.     AssignPath('ENV','RAM')
  119.     reqtoolsbase:=OpenLibrary('reqtools.library',37)
  120.     IF (gadtoolsbase:=OpenLibrary('gadtools.library',37))=NIL THEN Raise(ER_GAD)
  121.     Rename({wbsold},{wbs})
  122.     Rename({wbsoldinfo},{wbsinfo})
  123.     Rename({userold},{user})
  124. ENDPROC
  125.  
  126. PROC writelog(noden)
  127.     DEF i
  128.     f_hdl:=Open({sslog},NEWFILE)
  129.     FOR i:=0 TO 2
  130.         Write(f_hdl,IF count[i] THEN 'Y' ELSE 'N',2)
  131.     ENDFOR
  132.     Write(f_hdl,noden,StrLen(noden)+1)
  133.     Close(f_hdl)
  134. ENDPROC
  135.  
  136. PROC readlog()
  137.     DEF log,f_len,buffer,i,pos
  138.     log:={sslog}
  139.     f_len:=FileLength(log)
  140.     IF f_hdl:=Open(log,OLDFILE)
  141.         buffer:=New(f_len)
  142.         Read(f_hdl,buffer,f_len)
  143.         pos:=buffer
  144.         FOR i:=0 TO 2
  145.             IF OstrCmp(pos,'Y')=0
  146.                 count[i]:=TRUE
  147.             ELSE
  148.                 count[i]:=FALSE
  149.             ENDIF
  150.             pos:=pos+StrLen(pos)+1
  151.         ENDFOR
  152.         nodename:=String(StrLen(pos))
  153.         StrCopy(nodename,pos)
  154.         Dispose(buffer)
  155.         Close(f_hdl)
  156.     ELSE
  157.         req('''S:startupselector_log'' not found !\nCreating default _log ...\n'+
  158.                 'And starting with it ...')
  159.         writelog('Startup-Sequence')
  160.     ENDIF
  161. ENDPROC nodename
  162.  
  163. PROC req(msg)
  164.     IF reqtoolsbase
  165.         RtEZRequestA(msg,'OK',0,0,[RTEZ_FLAGS ,EZREQF_CENTERTEXT,
  166.                                                             RT_REQPOS   ,REQPOS_CENTERSCR,
  167.                                                             NIL])
  168.     ELSE
  169.         EasyRequestArgs(NIL,[20,0,'Information...',msg,'OK'],0,NIL)
  170.     ENDIF
  171. ENDPROC
  172.  
  173. PROC choicerep()
  174.     DEF myargs:PTR TO LONG,rdargs
  175.      myargs:=[0]
  176.      rdargs:=ReadArgs('PATH/O',myargs,NIL)
  177.     IF myargs[]=0
  178.         dirscan:='S:start/'
  179.     ELSE
  180.         dirscan:=String(StrLen(myargs[0]))
  181.         StrCopy(dirscan,myargs[0])
  182.     ENDIF
  183.     IF rdargs THEN FreeArgs(rdargs)
  184. ENDPROC
  185.  
  186. PROC scanstartupdir()
  187.     IF (dirlock:=Lock(dirscan,ACCESS_READ))=NIL THEN Raise(ER_NODIR)
  188.     Examine(dirlock,info)
  189.     IF info.direntrytype <= 0 THEN Raise(ER_NODIR)
  190.         NEW list
  191.         newList(list)
  192.         WHILE ExNext(dirlock,info)
  193.             INC fic_nbr
  194.             getstartupname(info.filename)
  195.         ENDWHILE
  196.     IF fic_nbr=0 THEN nofile()
  197. ENDPROC
  198.  
  199. PROC nofile()
  200.     req('No script in the directory !\nPress ''OK'' to load the Workbench')
  201.     SystemTagList({lwb},NIL)    
  202.     quit()
  203. ENDPROC
  204.  
  205. PROC getstartupname(infofilename)
  206.     DEF fic_chaine,length
  207.     DEF fic_chaineUp[30]:STRING,fic_preUp[30]:STRING,fic_finUp[30]:STRING
  208.     DEF newnode:PTR TO ln
  209.  
  210.     length:=StrLen(infofilename)
  211.     fic_chaine:=String(length)
  212.     StrCopy(fic_chaine,infofilename)
  213.     IF length>fic_lng THEN fic_lng:=length
  214.  
  215.     NEW newnode
  216.     newnode.name:=fic_chaine
  217.  
  218.     StrCopy(fic_chaineUp,fic_chaine)
  219.     UpperStr(fic_chaineUp)
  220.     IF fic_nbr>1
  221.         StrCopy(fic_preUp,list.head.name)
  222.         UpperStr(fic_preUp)
  223.     ENDIF
  224.     IF fic_nbr>2
  225.         StrCopy(fic_finUp,list.tailpred.name)
  226.         UpperStr(fic_finUp)
  227.     ENDIF
  228.  
  229.     IF fic_nbr=1
  230.         AddHead(list,newnode)
  231.     ELSEIF OstrCmp(fic_preUp,fic_chaineUp)=BIGGER
  232.         AddHead(list,newnode)
  233.     ELSEIF OstrCmp(fic_finUp,fic_chaineUp)=SMALLER
  234.         AddTail(list,newnode)
  235.     ELSE
  236.         node:=list.head
  237.         WHILE (node:=node.succ)<>NIL
  238.             StrCopy(fic_finUp,node.name)
  239.             UpperStr(fic_finUp)
  240.             IF OstrCmp(fic_finUp,fic_chaineUp)=BIGGER
  241.                 Insert(list,newnode,node.pred)
  242.                 RETURN
  243.             ENDIF
  244.         ENDWHILE
  245.     ENDIF
  246. ENDPROC
  247.  
  248. PROC addstartgadget()
  249.     DEF gadget,wbspname,wbsplen
  250.     gadget:=CreateContext({glist})
  251.     wbspname:='Call WBStartup+ ?'
  252.     wbsplen:=StrLen(wbspname)*8+8
  253.     lv_width:=fic_lng*8+28
  254.     IF fic_nbr<8
  255.         lv_heigth:=8*8+4
  256.     ELSEIF fic_nbr>29
  257.         lv_heigth:=29*8+4
  258.     ELSE
  259.         lv_heigth:=fic_nbr*8+4
  260.     ENDIF
  261.     gadget:=CreateGadgetA(LISTVIEW_KIND,gadget,
  262.                     [0,0,lv_width,lv_heigth,0,0,0,0,visual,LVID]:newgadget,
  263.                     [GTLV_LABELS,list,GTLV_SELECTED,TRUE,NIL])
  264.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  265.                     [lv_width+2,0,12,12,0,0,0,0,visual,USER]:newgadget,
  266.                     [GTCB_CHECKED,count[],NIL])
  267.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  268.           [lv_width+2,12,12,12,0,0,0,0,visual,WBS]:newgadget,
  269.                     [GTCB_CHECKED,count[1],NIL])
  270.     gadget:=CreateGadgetA(CHECKBOX_KIND,gadget,
  271.           [lv_width+2,24,12,12,0,0,0,0,visual,RMB]:newgadget,
  272.                     [GTCB_CHECKED,count[2],NIL])
  273.     IF wbsplus
  274.         gadget:=CreateGadgetA(BUTTON_KIND,gadget,
  275.                         [((213-wbsplen)/2)+lv_width,lv_heigth-13,wbsplen,12,
  276.                         wbspname,0,0,0,visual,WBSP]:newgadget,NIL)
  277.     ENDIF
  278. ENDPROC
  279.  
  280. PROC window()
  281.     DEF widcmp,wflags,rport,beveltags
  282.     DEF w_width,w_left,w_top
  283.     DEF nodenamelen
  284.     nodenamelen:=StrLen(nodename)*8+8
  285.     w_width:=lv_width+213
  286.     w_left:=(scr.width-w_width)/2
  287.     w_top:=(scr.height-lv_heigth)/2
  288.     beveltags:=[GT_VISUALINFO,visual,GTBB_FRAMETYPE,BBFT_BUTTON,NIL]
  289.     widcmp:=IDCMP_CLOSEWINDOW OR IDCMP_GADGETUP OR IDCMP_MENUPICK OR LISTVIEWIDCMP
  290.     wflags:=WFLG_CLOSEGADGET+WFLG_DRAGBAR+WFLG_GIMMEZEROZERO+WFLG_NEWLOOKMENUS
  291.     ptrwin:=OpenWindowTagList(NIL,[WA_TITLE        ,'Startup-Selector 1.1',
  292.                                  WA_GADGETS      ,glist,
  293.                                  WA_LEFT         ,w_left,
  294.                                  WA_TOP          ,w_top,
  295.                                  WA_INNERWIDTH   ,w_width,
  296.                                  WA_INNERHEIGHT  ,lv_heigth,
  297.                                  WA_IDCMP        ,widcmp,
  298.                                  WA_FLAGS        ,wflags,
  299.                                                                  WA_AUTOADJUST   ,-1,
  300.                                  WA_ACTIVATE     ,-1,
  301.                                  NIL])
  302.     Gt_RefreshWindow(ptrwin,NIL)
  303.     SetStdRast(ptrwin.rport)
  304.     rport:=ptrwin.rport
  305.     SetAPen(rport,2)
  306.     TextF(lv_width+32,8,'Disable User-Startup ?')
  307.     TextF(lv_width+32,20,'Disable WBStartup ?')
  308.     TextF(lv_width+32,32,'Save settings ?')
  309.     DrawBevelBoxA(rport,lv_width+29,0,184,11,beveltags)
  310.     DrawBevelBoxA(rport,lv_width+29,12,160,11,beveltags)
  311.     DrawBevelBoxA(rport,lv_width+29,24,128,11,beveltags)
  312.     IF wbsplus
  313.         TextF((213-nodenamelen)/2+lv_width,(lv_heigth-13-35)/2+35,nodename)
  314.     ELSE
  315.         TextF((213-nodenamelen)/2+lv_width,(lv_heigth-35)/2+35,nodename)
  316.     ENDIF
  317. ENDPROC
  318.  
  319. PROC createmen()
  320.   menu:=CreateMenusA([1,0,'Projet',0,0,0,0,
  321.                       2,0,'About',0,0,0,1,
  322.                                             2,0,NM_BARLABEL,0,0,0,0,
  323.                                             2,0,'NewCli',0,0,0,2,
  324.                                             2,0,NM_BARLABEL,0,0,0,0,
  325.                                             2,0,'Quit',0,0,0,3,
  326.                       0,0,0,0,0,0,0]:newmenu,[GTMN_FRONTPEN,1,
  327.                                                                                             GTMN_NEWLOOKMENUS,TRUE,
  328.                                                                                             NIL])
  329.   LayoutMenusA(menu,visual,NIL)
  330.   SetMenuStrip(ptrwin,menu)
  331. ENDPROC
  332.  
  333. PROC launchstart(file)
  334.     DEF launch
  335.     IF count[]
  336.         IF (Rename({user},{userold}))=NIL
  337.             req('Can''t rename User-Startup !')
  338.             RETURN
  339.         ENDIF
  340.     ENDIF
  341.     IF count[1]
  342.         IF (Rename({wbs},{wbsold}))=NIL OR (Rename({wbsinfo},{wbsoldinfo}))=NIL
  343.             req('Can''t rename WBStartup or WBStartup.info !')
  344.         ENDIF
  345.     ENDIF
  346.     StrCopy(ch,dirscan,ALL)
  347.     AddPart(ch,file,70)
  348.     setscriptattr(ch)
  349.     IF scr THEN UnlockPubScreen(NIL,scr)
  350.     IF ptrwin THEN CloseW(ptrwin)
  351.     IF (launch:=SystemTagList(ch,NIL))=TRUE
  352.         req('Can''t execute this script !\nPlease try another one ...')
  353.         RETURN
  354.     ENDIF
  355.     quit()
  356. ENDPROC
  357.  
  358. PROC setscriptattr(file)
  359.     DEF mask
  360.     IF FileLength(file)>-1
  361.         f_hdl:=Open(file,OLDFILE)
  362.         ExamineFH(f_hdl,info)
  363.         mask:=info.protection
  364.         Close(f_hdl)
  365.         mask:=mask OR FIBF_SCRIPT
  366.         SetProtection(file,mask)
  367.     ENDIF
  368. ENDPROC
  369.  
  370. PROC wbsplusprefs()
  371.     IF dirlock:=Lock(wbsp_path,ACCESS_READ)
  372.         wbsplus:=TRUE
  373.         UnLock(dirlock)
  374.     ENDIF    
  375. ENDPROC
  376.  
  377. PROC quit()
  378.     IF menu THEN FreeMenus(menu)
  379.     IF dirlock THEN UnLock(dirlock)
  380.     IF scr THEN UnlockPubScreen(NIL,scr)
  381.     IF ptrwin THEN ClearMenuStrip(ptrwin)
  382.     IF visual THEN FreeVisualInfo(visual)
  383.     IF gadtoolsbase THEN CloseLibrary(gadtoolsbase)
  384.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  385.     OpenWorkBench()
  386.     CleanUp(0)
  387. ENDPROC
  388.  
  389. wbs: CHAR 'SYS:WBStartup',0
  390. wbsinfo: CHAR 'SYS:WBStartup.info',0
  391. wbsold: CHAR 'SYS:WBStartupOld',0
  392. wbsoldinfo: CHAR 'SYS:WBStartupOld.info',0
  393. user: CHAR 'S:User-Startup',0
  394. userold: CHAR 'S:User-StartupOld',0
  395. lwb: CHAR 'C:LoadWB',0
  396. sslog: CHAR 'S:startupselector_log',0
  397.